# !/bin/bash

# 定义函数
myFunction(){
	a = 'liaohao'
	echo "你好，$a"

}
myFunction
# 此时a仍然为全局变量，因为在函数内部没有用local关键字进行声明
echo "你好,$a"

myFuncName(){

	local b = 'student'
	echo "你好, $b"

}
myFuncName
# 此时b使用local关键字进行声明成为全局变量，仅在函数内有效，外部无法访问
echo "你好,$b"




# 位置变量
echo "第一个参数：$1"
echo "第四个参数：$4"
echo "第十个参数：${10}"
# 位置变量在shell脚本内部（函数外部）接收是function.sh a b c 1 2 3 4 5 6 7 8传递的参数
# 在shell脚本的函数中，接收的是函数调用是传递的参数 myFuncName a b c


# 特殊变量
# 当输入参数为function.sh a b c 1 2 3 4 5 6 7 8 
echo "位置参数的个数：$#"
echo "位置参数*的参数列表：$*"
echo "位置参数@的参数列表：$@"
echo "上一个命令执行的结果状态：$?"

# 输出
# 位置参数的个数：11
# 位置参数* 的参数列表：a b c 1 2 3 4 5 6 7 8
# 位置参数@ 的参数列表：a b c 1 2 3 4 5 6 7 8
# 上一个命令执行的结果状态：0



# 数组
string = (1,2,3)

# 获取数组的第一个元素，下标从0开始
echo "第一个元素为：$string"
# 获取数组的第二个元素
echo "第二个元素为：${string[1]}"
echo "第三个元素为：${string[2]}"
# 获取数组的全部元素
echo "全部元素：${string[*]}"
scho "全部元素：${string[@]}"
# 修改数组的值
string[1] = 4
echo "修改后数组第二个元素为：${string[1]}"

# 销毁数组元素
unset string[1]
# 销毁数组整个数组
unset string[*]
unset string[@]


# 逻辑表达式
# command1 && command2（逻辑与）若command1执行成功 即退出状态为0 则执行command2
# command1 || command2（逻辑或）若command1执行成功 即退出状态为0 则不执行command2

test -d /hello || echo "文件夹/hello不存在"
test -f profile && echo "文件profile不存在"
test -e shell.sh || echo "文件shell.sh不存在"


# 算术表达式
a = 3
b = -2
let c = $a + $b
c = $[$a + $b]
c = $((a + b))
echo "$c"

# 条件表达式
# -gt 大于  -lt 小于  -eq 等于  -ge 大于等于  -le 小于等于
[3 -gt -2]
echo $?

# 分支结构
# if语句
if [$? -eq 0];then
	echo "执行成功！"
fi
# 多分支结构
# if [条件语句1];then
#	执行语句1
# elif [条件语句2];then
# 	执行语句2
# else
# 	执行语句3
# fi

#case语句
read -p "please input a number [1-5]:"num
case $num in 
1)
	echo "one"
	exit 0
;;
2)
	echo "two"
;;
3)
	echo "Three"
;;
4)
	echo "four"
;;
5)
	echo "five"
;;
*)
	echo "please input [1-5]"
;;
esac


# 循环
# while循环
# 每两秒打印系统负载
while true
do
	uptime
	sleep 2
done

# for循环
for i in {1..6}
do
	echo "$i"
done


# 正则表达式
# "."匹配任意单个字符
grep f.p /etc/password
cat /etc/password | grep f.p

# "^"匹配一行的开头
# 以r开头的行
cat /etc/passwd | grep ^r
# 匹配第二个字符为k的行
grep "^.k" shell.txt


# "$"匹配一行的结尾
cat /etc/passwd | grep x$
grep ".k$" shell.txt



# "^$"匹配空行
cat /etc/group | grep ^$



# *的使用
# *和上一个字符连用   表示匹配上一个字符0次或多次
grep ro*t /etc/group

# []的使用
# 匹配[1,3],[1-5]
grep "[1-5]" shell.txt
# 匹配zk和xk
grep "[xz]k" shell.txt


#[^zx]k 匹配除zx之外的任意一个字符
grep "{^zx}k" shell.txt


# 转义字符\用来匹配某一特殊字符
grep \$PATH /etc/profile


# <> 单词首尾边界
# 匹配单词边界
grep "\<are\>" shell.txt
# 匹配单词首部
grep "\<are" shell.txt
# 匹配单词尾部
grep "re\>" shell.txt

# shell脚本检查
# 不执行，仅查询语法问题
sh -n scripts.sh
# 执行script前，先将scripts内容输出到屏幕
sh -v scripts.sh
# 将使用到的script内容显示到屏幕上
sh -x scripts.sh
